package com.ihome.excel.xlsx.tool;

import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;

import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;

public class StaxHelper {

	 private static final POILogger logger = POILogFactory.getLogger(StaxHelper.class);

	    private StaxHelper() {}

	    /**
	     * Creates a new StAX XMLInputFactory, with sensible defaults
	     */
	    public static XMLInputFactory newXMLInputFactory() {
	        XMLInputFactory factory = XMLInputFactory.newFactory();
	        trySetProperty(factory, XMLInputFactory.IS_NAMESPACE_AWARE, true);
	        trySetProperty(factory, XMLInputFactory.IS_VALIDATING, false);
	        trySetProperty(factory, XMLInputFactory.SUPPORT_DTD, false);
	        trySetProperty(factory, XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
	        return factory;
	    }

	    /**
	     * Creates a new StAX XMLOutputFactory, with sensible defaults
	     */
	    public static XMLOutputFactory newXMLOutputFactory() {
	        XMLOutputFactory factory = XMLOutputFactory.newFactory();
	        trySetProperty(factory, XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
	        return factory;
	    }

	    /**
	     * Creates a new StAX XMLEventFactory, with sensible defaults
	     */
	    public static XMLEventFactory newXMLEventFactory() {
	        return XMLEventFactory.newFactory();
	    }
	            
	    private static void trySetProperty(XMLInputFactory factory, String feature, boolean flag) {
	        try {
	            factory.setProperty(feature, flag);
	        } catch (Exception e) {
	            logger.log(POILogger.WARN, "StAX Property unsupported", feature, e);
	        } catch (AbstractMethodError ame) {
	            logger.log(POILogger.WARN, "Cannot set StAX property because outdated StAX parser in classpath", feature, ame);
	        }
	    }

	    private static void trySetProperty(XMLOutputFactory factory, String feature, boolean flag) {
	        try {
	            factory.setProperty(feature, flag);
	        } catch (Exception e) {
	            logger.log(POILogger.WARN, "StAX Property unsupported", feature, e);
	        } catch (AbstractMethodError ame) {
	            logger.log(POILogger.WARN, "Cannot set StAX property because outdated StAX parser in classpath", feature, ame);
	        }
	    }
	
}
